package com.bbva.kyfb.kyfbdaohostfo.servicios.host.acceso;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.bbva.jee.arq.spring.core.gce.ExcepcionEjecucionAplicacion;
import com.bbva.jee.arq.spring.core.host.ExcepcionTransaccion;
import com.bbva.jee.arq.spring.core.host.protocolo.ExcepcionRespuestaHost;
import com.bbva.jee.arq.spring.core.host.transporte.ExcepcionTransporte;
import com.bbva.jee.arq.spring.core.log.I18nLog;
import com.bbva.jee.arq.spring.core.log.I18nLogFactory;
import com.bbva.kyfb.kyfbdaohostfo.servicios.host.acceso.interfaces.IAccesoSistemasHostFo;
import com.bbva.kyfb.kyfbdaohostfo.servicios.host.pggptk70_1_1_1.PeticionTransaccionPggptk70_1_1_1;
import com.bbva.kyfb.kyfbdaohostfo.servicios.host.pggptk70_1_1_1.RespuestaTransaccionPggptk70_1_1_1;
import com.bbva.kyfb.kyfbdaohostfo.servicios.host.pggptk70_1_1_1.TransaccionPggptk70_1_1_1;
import com.bbva.kyfb.kyfbdaohostfo.servicios.host.pggptw42_1_1_3.PeticionTransaccionPggptw42_1_1_3;
import com.bbva.kyfb.kyfbdaohostfo.servicios.host.pggptw42_1_1_3.RespuestaTransaccionPggptw42_1_1_3;
import com.bbva.kyfb.kyfbdaohostfo.servicios.host.pggptw42_1_1_3.TransaccionPggptw42_1_1_3;
import com.bbva.kyfb.kyfbdaohostfo.servicios.host.tpbft080_1_8_1.PeticionTransaccionTpbft080_1_8_1;
import com.bbva.kyfb.kyfbdaohostfo.servicios.host.tpbft080_1_8_1.RespuestaTransaccionTpbft080_1_8_1;
import com.bbva.kyfb.kyfbdaohostfo.servicios.host.tpbft080_1_8_1.TransaccionTpbft080_1_8_1;
import com.bbva.kyfb.kyfbdto.firmas.errores.Errores_kyfb_servicios;
import com.bbva.kyfb.kyfbdtofo.FicheroRequest;
import com.bbva.kyfb.kyfbdtofo.trf.ConsultarDetalleCuentaInDto;
import com.bbva.kyfb.kyfbdtofo.trf.ConsultarDetalleCuentaOutDto;
import com.bbva.kyfb.kyfbdtofo.trf.DetalleTransferencia;
import com.bbva.kyfb.kyfbdtofo.trf.DetalleTraspaso;
import com.bbva.kyfb.kyfbdtofo.trf.TransferenciaOutDto;

/**
 * The Interface AccesoSistemasHost.
 */

@Component
public class AccesoSistemasHostFo implements IAccesoSistemasHostFo {
	
	private static final I18nLog Log = I18nLogFactory.getLogI18n(AccesoSistemasHostFo.class);

	/** The transaccionW42. */
	@Autowired
	private TransaccionPggptw42_1_1_3 transaccionW42;

	/** The transaccionK70. */
	@Autowired
	private TransaccionPggptk70_1_1_1 transaccionK70;

	/** The transaccion080. */
	@Autowired
	private TransaccionTpbft080_1_8_1 transaccion080;

	@Override
	public TransferenciaOutDto relizaTransferenciaNacional(
			final DetalleTransferencia trfIn, FicheroRequest ficheroRequest)
			throws ExcepcionEjecucionAplicacion {
		TransferenciaOutDto trfOutDto = null;
		if (trfIn != null) {
			final PeticionTransaccionPggptw42_1_1_3 peticion = DtoToTransaccion
					.trfNacional(trfIn, ficheroRequest);

			try {
				Log.info("Invocando transaccion, peticion: " +
				 peticion.toString());
				RespuestaTransaccionPggptw42_1_1_3 respuesta = transaccionW42
						.invocar(peticion);
				trfOutDto = TransaccionToDto.RespuestaTranseferencia(respuesta);
				 Log.info("Recibida respuesta: " + respuesta);
			} catch (ExcepcionRespuestaHost e) {
				Log.error("Error recibido desde host, codigoError: " + 
						e.getCodigoError() + ", descripcion: " + e.getMessage());
				trfOutDto = TransaccionToDto.RespuestaTranseferencia(e);
			} catch (ExcepcionTransporte e) {
				Log.error("Error de transporte TxPggptw42_1_1_3", e);
				Log.error("*** Lanzamos Anuladora ***");
				peticion.setXtiCorrectoE("S");
				try {
					transaccionW42.invocar(peticion);
				} catch (ExcepcionTransaccion e1) {
					Log.error("Error de Transaccion TxPggptw42_1_1_3", e);
				}				
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.SERVICIO_NO_DISPONIBLE, e);
			} catch (ExcepcionTransaccion e) {
				Log.error("Error de Transaccion TxPggptw42_1_1_3", e);
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.SERVICIO_NO_DISPONIBLE, e);
			}
		}
		return trfOutDto;
	}

	@Override
	public TransferenciaOutDto relizaTransferenciaNacional(
			DetalleTraspaso trfIn, FicheroRequest ficheroRequest)
			throws ExcepcionEjecucionAplicacion {
		TransferenciaOutDto trfOutDto = null;
		if (trfIn != null) {
			final PeticionTransaccionPggptw42_1_1_3 peticion = DtoToTransaccion
					.trfNacional(trfIn, ficheroRequest);

			try {
				Log.info("Invocando transaccion, peticion: " +
				peticion.toString());
				RespuestaTransaccionPggptw42_1_1_3 respuesta = transaccionW42
						.invocar(peticion);
				trfOutDto = TransaccionToDto.RespuestaTranseferencia(respuesta);
				Log.info("Recibida respuesta: " + respuesta);
			} catch (ExcepcionRespuestaHost e) {
				Log.error("Error recibido desde host, codigoError: " +
						e.getCodigoError() + ", descripcion: " + e.getMessage());
				trfOutDto = TransaccionToDto.RespuestaTranseferencia(e);
			} catch (ExcepcionTransporte e) {
				Log.error("Error de transporte TxPggptw42_1_1_3", e);
				Log.error("*** Lanzamos Anuladora ***");
				peticion.setXtiCorrectoE("S");
				try {
					transaccionW42.invocar(peticion);
				} catch (ExcepcionTransaccion e1) {
					Log.error("Error de Transaccion TxPggptw42_1_1_3", e);
				}
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.SERVICIO_NO_DISPONIBLE, e);
			} catch (ExcepcionTransaccion e) {
				Log.error("Error de Transaccion TxPggptw42_1_1_3", e);
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.SERVICIO_NO_DISPONIBLE, e);
			}
		}
		return trfOutDto;
	}

	@Override
	public TransferenciaOutDto relizaTransferenciaInternacional(
			final DetalleTransferencia trfIn, FicheroRequest ficheroRequest)
			throws ExcepcionEjecucionAplicacion {
		TransferenciaOutDto trfOutDto = null;
		if (trfIn != null) {
			final PeticionTransaccionPggptk70_1_1_1 peticion = DtoToTransaccion
					.trfInternacional(trfIn, ficheroRequest);

			try {
				final RespuestaTransaccionPggptk70_1_1_1 respuesta = transaccionK70
						.invocar(peticion);
				trfOutDto = TransaccionToDto.RespuestaTranseferencia(respuesta);
			} catch (ExcepcionRespuestaHost e) {
				Log.error("Error recibido desde host, codigoError: " +
						e.getCodigoError() + ", descripcion: " + e.getMessage());
				trfOutDto = TransaccionToDto.RespuestaTranseferencia(e);
			} catch (ExcepcionTransporte e) {
				Log.error("Error de transporte TxTransaccionPggptk70_1_1_1", e);
				Log.error("*** Lanzamos Anuladora ***");
				peticion.setXtiCorrecto("S");
				try {
					transaccionK70.invocar(peticion);
				} catch (ExcepcionTransaccion e1) {
					Log.error("Error de Transaccion TxTransaccionPggptk70_1_1_1", e);
				}
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.SERVICIO_NO_DISPONIBLE, e);
			} catch (ExcepcionTransaccion e) {
				Log.error("Error de Transaccion TxTransaccionPggptk70_1_1_1", e);
				throw new ExcepcionEjecucionAplicacion(
						Errores_kyfb_servicios.SERVICIO_NO_DISPONIBLE, e);
			}
		}
		return trfOutDto;
	}

	@Override
	public ConsultarDetalleCuentaOutDto consultarDetalleCuenta(
			final ConsultarDetalleCuentaInDto cdcDtoIn) {
		ConsultarDetalleCuentaOutDto cdcDtoOut = null;
		if (cdcDtoIn != null) {
			final PeticionTransaccionTpbft080_1_8_1 peticion = DtoToTransaccion
					.consultarDetalleCuenta(cdcDtoIn);

			try {
				final RespuestaTransaccionTpbft080_1_8_1 respuesta = transaccion080
						.invocar(peticion);
				cdcDtoOut = TransaccionToDto
						.RespuestaconsultarDetalleCuenta(respuesta);
			} catch (final Exception e) {
				Log.error("Error de Transaccion TxTpbft080_1_8_1", e);
				cdcDtoOut = new ConsultarDetalleCuentaOutDto();
				cdcDtoOut.setTitular("");
			}
		}
		return cdcDtoOut;
	}

}
